/*
 * Ant Colony Optimization
 * Alex Oliveira
 * Heitor Luiz
 */

#include <stdio.h>
#include <stdlib.h>
#include "comum.h"
#include "exemplos.h"

#define EXEMPLO0 "templates/exemplo0.wrl"
#define EXEMPLO1 "templates/exemplo1.wrl"
#define EXEMPLO2 "templates/exemplo2.wrl"
#define EXEMPLO3 "templates/exemplo3.wrl"
#define EXEMPLO4 "templates/exemplo4.wrl"
#define EXEMPLO5 "templates/exemplo5.wrl"


/*
 * Recebe o número do arquivo de exemplo e incializa o terreno.
 */
void init_exemplo(int n) {
	terreno.formigueiro.x = 50;
	terreno.formigueiro.y = 50;
	int i, j, k;
	switch (n) {
    case 0:
         terreno.vrml = fopen(EXEMPLO0, "r+");
         // Comida 1
		for (i = 5; i <= 15; i++)
			for (j = 5; j <= 15; j++)
				terreno.comida[i][j] = true;
		// Comida 2
		for (i = 10; i <= 30; i++)
			for (j = 70; j <= 90; j++)
				terreno.comida[i][j] = true;
		// Comida 3
		for (i = 80; i <= 90; i++)
			for (j = 15; j <= 25; j++)
				terreno.comida[i][j] = true;
		// Comida 4
		for (i = 85; i <= 95; i++)
			for (j = 85; j <= 95; j++)
				terreno.comida[i][j] = true;
		break;
	case 1:
		terreno.vrml = fopen(EXEMPLO1, "r+");
		// Grama
		for (i = 0; i <= 60; i++)
			for (j = 0; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		for (i = 0; i <= 20; i++)
			for (j = 40; j <= 55; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		k = 55;
		for (i = 20; i <= 35; i++) {
			for (j = k; j >= 40; j--)
				terreno.custo[i][j] = CUSTO_GRAMA;
			k--;
		}
		k = 40;
		for (i = 60; i <= 100; i++) {
			for (j = k; j >= 0; j--)
				terreno.custo[i][j] = CUSTO_GRAMA;
			k--;
		}
		// Obstáculo  1
		for (i = 0; i <= 10; i++)
			for (j = 0; j <= 30; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		for (i = 10; i <= 20; i++)
			for (j = 0; j <= 20; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		for (i = 20; i <= 30; i++)
			for (j = 0; j <= 10; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 20;
		for (i = 20; i <= 30; i++) {
			for (j = k; j >= 10; j--)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k--;
		}
		// Obstáculo 2
		for (i = 0; i <= 20; i++)
			for (j = 55; j <= 60; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 70;
		for (i = 20; i >= 10; i--) {
			for (j = 70; j >= 60; j--)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k--;
		}
		// Obstáculo 3
		for (i = 0; i <= 20; i++)
			for (j = 80; j <= 90; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 70;
		for (i = 0; i <= 10; i++) {
			for (j = 70; j <= 80; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		// Obstáculo  4
		for (i = 65; i <= 70; i++)
			for (j = 20; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		for (i = 70; i <= 75; i++)
			for (j = 25; j <= 35; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 20;
		for (i = 70; i <= 75; i++) {
			for (j = k; j <= 25; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		k = 40;
		for (i = 70; i <= 75; i++) {
			for (j = k; j >= 35; j--)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k--;
		}
		// Obstáculo 5
		for (i = 70; i <= 80; i++)
			for (j = 60; j <= 70; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Obstáculo 6
		for (i = 40; i <= 60; i++)
			for (j = 80; j <= 90; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Comida 1
		for (i = 7; i <= 13; i++)
			for (j = 67; j <= 73; j++)
				terreno.comida[i][j] = true;
		// Comida 2
		for (i = 28; i <= 32; i++)
			for (j = 28; j <= 32; j++)
				terreno.comida[i][j] = true;
		// Comida 3
		for (i = 68; i <= 72; i++)
			for (j = 88; j <= 92; j++)
				terreno.comida[i][j] = true;
		// Comida 4
		for (i = 85; i <= 95; i++)
			for (j = 15; j <= 25; j++)
				terreno.comida[i][j] = true;
		break;
	case 2:
		terreno.vrml = fopen(EXEMPLO2, "r+");
		// Grama
		for (i = 0; i <= CUSTO_GRAMA; i++)
			for (j = 60; j <= 100; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		for (i = CUSTO_GRAMA; i <= 20; i++)
			for (j = 90; j <= 100; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		for (i = 20; i <= 50; i++)
			for (j = 70; j <= 100; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		// Obstáculo 1
		for (i = 25; i <= 35; i++)
			for (j = 0; j <= 20; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Obstáculo 2
		for (i = 0; i <= 15; i++)
			for (j = 30; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 30;
		for (i = 15; i <= 25; i++) {
			for (j = k; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		// Obstáculo 3
		for (i = 70; i <= 80; i++)
			for (j = 10; j <= 20; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Obstáculo 4
		for (i = 65; i <= 90; i++)
			for (j = 35; j <= 45; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		for (i = 80; i <= 90; i++)
			for (j = 45; j <= 60; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 55;
		for (i = 80; i >= 75; i--) {
			for (j = k; j <= 60; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		// Obstáculo 5
		for (i = 60; i <= 70; i++)
			for (j = 80; j <= 90; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
	     // Comida 1
		for (i = 0; i <= 20; i++)
			for (j = 0; j <= 10; j++)
				terreno.comida[i][j] = true;
		k = 30;
		for (i = 0; i <= 20; i++) {
			for (j = k; j >= 10; j--)
				terreno.comida[i][j] = true;
			k--;
		}
		// Comida 2
		for (i = 10; i <= 15; i++)
			for (j = 80; j <= 85; j++)
				terreno.comida[i][j] = true;
		// Comida 3
		for (i = 67; i <= 73; i++)
			for (j = 47; j <= 53; j++)
				terreno.comida[i][j] = true;
		// Comida 4
		for (i = 90; i <= 100; i++)
			for (j = 0; j <= 10; j++)
				terreno.comida[i][j] = true;
		break;
	case 3:
		terreno.vrml = fopen(EXEMPLO3, "r+");
		// Grama
		for (i = 60; i <= 100; i++)
			for (j = 0; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		k = 40;
		for (i = 60; i >= 20; i--) {
			for (j = k; j >= 0; j--)
				terreno.custo[i][j] = CUSTO_GRAMA;
			k--;
		}
		// Obstáculo 1
		for (i = 10; i <= 20; i++)
			for (j = 40; j <= 70; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		for (i = 20; i <= 30; i++)
			for (j = 40; j <= 50; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 30;
		for (i = 20; i <= 30; i++) {
			for (j = k; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		// Obstáculo 2
		for (i = 10; i <= 30; i++)
			for (j = 90; j <= 100; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 80;
		for (i = 10; i <= 20; i++) {
			for (j = k; j <= 90; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		// Obstáculo 3
		for (i = 50; i <= 60; i++)
			for (j = 10; j <= 20; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 20;
		for (i = 50; i >= 40; i--) {
			for (j = k; j >= 10; j--)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k--;
		}
		// Obstáculo 4
		for (i = 90; i <= 100; i++)
			for (j = 10; j <= 30; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Obstáculo 5
		for (i = 85; i <= 100; i++)
			for (j = 60; j <= 70; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 70;
		for (i = 85; i >= 75; i--) {
			for (j = k; j >= 60; j--)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k--;
		}
		// Obstáculo 6
		for (i = 65; i <= 75; i++)
			for (j = 70; j <= 100; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 65;
		for (i = 65; i <= 70; i++) {
			for (j = k; j <= 70; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		// Comida 1
		for (i = 0; i <= 10; i++)
			for (j = 20; j <= 30; j++)
				terreno.comida[i][j] = true;
		// Comida 2
		for (i = 0; i <= 5; i++)
			for (j = 95; j <= 100; j++)
				terreno.comida[i][j] = true;
		// Comida 3
		for (i = 70; i <= 80; i++)
			for (j = 15; j <= 25; j++)
				terreno.comida[i][j] = true;
		// Comida 4
		for (i = 80; i <= 100; i++)
			for (j = 80; j <= 100; j++)
				terreno.comida[i][j] = true;
		break;
	case 4:
		terreno.vrml = fopen(EXEMPLO4, "r+");
		// Grama
		for (i = 30; i <= 40; i++)
			for (j = 20; j <= 30; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		for (i = 20; i <= 30; i++)
			for (j = 30; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		k = 20;
		for (i = 30; i >= 20; i--) {
			for (j = k; j <= 30; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
			k++;
		}
		k = 40;
		for (i = 30; i <= 40; i++) {
			for (j = k; j >= 30; j--)
				terreno.custo[i][j] = CUSTO_GRAMA;
			k--;
		}
		k = 20;
		for (i = 40; i <= 50; i++) {
			for (j = k; j <= 30; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
			k++;
		}
		for (i = 35; i <= 100; i++)
			for (j = 70; j <= 100; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		for (i = 60; i <= 100; i++)
			for (j = 60; j <= 70; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		for (i = 70; i <= 100; i++)
			for (j = 50; j <= 60; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		k = 50;
		for (i = 70; i >= 60; i--) {
			for (j = k; j <= 60; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
			k++;
		}
		// Obstáculo 1
		for (i = 0; i <= 10; i++)
			for (j = 15; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		for (i = 10; i <= 20; i++)
			for (j = 10; j <= 20; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 10;
		for (i = 10; i >= CUSTO_GRAMA; i--) {
			for (j = k; j <= 15; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		// Obstáculo 2
		for (i = 15; i <= 35; i++)
			for (j = 75; j <= 85; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Obstáculo 3
		for (i = 35; i <= 60; i++)
			for (j = 60; j <= 70; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 50;
		for (i = 35; i <= 45; i++) {
			for (j = k; j <= 60; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		// Obstáculo 4
		for (i = 65; i <= 75; i++)
			for (j = 20; j <= 50; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		for (i = 75; i <= 80; i++)
			for (j = 20; j <= 30; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 30;
		for (i = 80; i <= 90; i++) {
			for (j = k; j >= 20; j--)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k--;
		}
		// Obstáculo 5
		for (i = 80; i <= 90; i++)
			for (j = 80; j <= 90; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Comida 1
		for (i = 0; i <= 5; i++)
			for (j = 10; j <= 15; j++)
				terreno.comida[i][j] = true;
		k = 15;
		for (i = 5; i <= 10; i++) {
			for (j = k; j >= 10; j--)
				terreno.comida[i][j] = true;
			k--;
		}
		// Comida 2
		for (i = 20; i <= 30; i++)
			for (j = 90; j <= 100; j++)
				terreno.comida[i][j] = true;
		// Comida 3
		for (i = 85; i <= 90; i++)
			for (j = 35; j <= 40; j++)
				terreno.comida[i][j] = true;
		break;
	case 5:
		terreno.vrml = fopen(EXEMPLO5, "r+");
		// Grama
		for (i = 0; i <= 60; i++)
			for (j = 0; j <= 20; j++)
				terreno.custo[i][j] = CUSTO_GRAMA;
		k = 80;
		for (i = 0; i <= 60; i++) {
			for (j = k; j >= 20; j--)
				terreno.custo[i][j] = CUSTO_GRAMA;
			k--;
		}
		// Obstáculo 1
		for (i = 0; i <= 20; i++)
			for (j = 85; j <= 100; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Obstáculo 2
		for (i = 20; i <= 30; i++)
			for (j = 10; j <= 30; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 20;
		for (i = 30; i <= 40; i++) {
			for (j = k; j >= 10; j--)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k--;
		}
		// Obstáculo 3
		for (i = 50; i <= 60; i++)
			for (j = 30; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		for (i = 60; i <= 70; i++)
			for (j = 40; j <= 50; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		k = 30;
		for (i = 60; i <= 70; i++) {
			for (j = k; j <= 40; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
			k++;
		}
		// Obstáculo 4
		for (i = 60; i <= 70; i++)
			for (j = 75; j <= 95; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Obstáculo 5
		for (i = 80; i <= 90; i++)
			for (j = 50; j <= 60; j++)
				terreno.custo[i][j] = CUSTO_OBSTACULO;
		// Comida 1
		for (i = 0; i <= 10; i++)
			for (j = 70; j <= 80; j++)
				terreno.comida[i][j] = true;
		// Comida 2
		for (i = 70; i <= 80; i++)
			for (j = 20; j <= 30; j++)
				terreno.comida[i][j] = true;
		// Comida 3
		for (i = 77; i <= 83; i++)
			for (j = 87; j <= 93; j++)
				terreno.comida[i][j] = true;
		break;
	default:
		puts("Arquivo de exemplo desconhecido, usando campo limpo.");
		fputs("A função de inicialização dos terrenos de exemplo recebeu um argumento que representa um terreno desconhecido.",
				stderr);
	}
	if (terreno.vrml == NULL) {
		fputs("ERRO, Não abriu o arquivo!", stderr);
		exit(1);
	}
}
